
%\title{ \LARGE ``INTERF\'AZ PARA CREAR Y EDITAR CURVAS Y SUPERFICIES NURBS 3D''}

%\author{ \large Gustavo Enrique Bellino}

%\date{\today}

\documentclass[12pt]{article}

\newcommand\normalsubformula[1]{\text{\mathversion{normal}$#1$}}

\usepackage{float}
\usepackage{amsmath,amssymb,amsfonts,textcomp}
\usepackage{color}
\usepackage{array}
\usepackage{supertabular}
\usepackage{titlesec}
\usepackage{graphicx}
\usepackage{times}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{amsmath,amssymb,amsfonts,textcomp}
\newcommand{\BibTeX}{{\sc Bib}\TeX}


\renewcommand\refname{Bibliograf{\'\i}a}

\renewcommand{\contentsname}{\'Indice}
\renewcommand{\listfigurename}{\'Indice de figuras}

\renewcommand{\partname}{Cap\'itulo}
\renewcommand{\figurename}{Figura}

%\title{ \LARGE ``INTERF\'AZ PARA CREAR Y EDITAR CURVAS Y SUPERFICIES NURBS 3D''}
%\author{Marcelo Stutz}
\begin{document}
\thispagestyle{empty}
%======================================================================
%\pagestyle{empty}
%======================================================================
%\setlength{\fboxrule}{0.0mm}
%\fbox{\parbox{1\linewidth}{
\begin{center}
\vspace{1cm}
\Large Universidad Nacional del Litoral\\
\Large Facultad de Ingenier\'ia y Ciencias H\'idricas\\

\vspace{1cm}

\begin{figure}[h]
 \centering
 \includegraphics[bb=0 0 130 130]{../fuente/Imagenes/logo_unl.png}
\end{figure}

\vspace{2cm}
%\LARGE \textbf {``Interf\'az para crear y editar curvas y superficies NURBS 3D''}\\
\LARGE \textbf {``INTERF\'AZ PARA CREAR Y EDITAR CURVAS Y SUPERFICIES NURBS 3D''}\\
%
\vspace{2cm}

%
\Large Proyecto Final de la carrera Ingenier\'ia en Inform\'atica\\
%
\vspace{1cm}
%
%
\Large Alumno:\hspace{0.4cm}Gustavo Enrique Bellino\\
\vspace{0.5cm}
\Large Director:\hspace{0.4cm}Nestor Calvo\\
%
\vspace{1cm}

\large Mayo de 2009
%
%\begin{tabular}{|>{\large\columncolor{Apricot}}p{7.5cm}|>{\large\columncolor{Apricot}}p{7.5cm}|}

\end{center}
%}}

%\maketitle

\cleardoublepage

\begin{abstract}
En este trabajo se desarrolla un sistema inform\'atico con una interfaz gr\'afica destinada a la creaci\'on, visualizaci\'on y edici\'on de superficies NURBS en 3D. Ofrece facilidades gr\'aficas para agregar atributos principales (puntos de control) de las superficies NURBS. Por otra parte, se presenta una forma de manipular puntos en 3D mediante proyecciones sobre un plano m\'ovil en el espacio tridimensional. Esto \'ultimo posibilita editar las superficies de una manera m\'as fluida. El sistema, adem\'as, permite exportar e importar los mo\-de\-los generados en un archivo en formato XML, es multiplataforma, portable y brinda la posibilidad de expandir sus funciones en forma de m\'odulos.
\end{abstract}

\cleardoublepage

%Se crea la tabla de contenido
\newpage\cleardoublepage

\tableofcontents

\cleardoublepage

\listoffigures

\clearpage

%INTRODUCCION

\part{Introducci\'on}

	\section{Introducci\'on}

Cuando representamos en la computadora objetos del mundo real con una fi\-na\-li\-dad t\'ecnica es necesario ingresar a un medio digital las caracter\'isticas de \'estos para que puedan ser visualizados y manipulados. Es decir, un objeto dispone de ciertos atributos (forma, posici\'on, material, etc.) que nos indican donde se encuentran y c\'omo se ven.

Una de las formas de ingresar datos a un medio digital es a trav\'es de una interfaz gr\'afica la cual es un componente de una aplicaci\'on inform\'atica que el usuario visualiza y a trav\'es de la cual interact\'ua con el sistema. Est\'a conformada por distintas met\'aforas gr\'aficas que el usuario ya ha aprendido a reconocer, por ejemplo ventanas, botones, men\'ues e \'iconos, entre otros elementos.
	
En inform\'atica, estos objetos se visualizan a trav\'es de gr\'aficos, los cuales se clasifican en dos tipos, dependiendo de si se dispone la imagen (gr\'afico rasterizado) o los datos para generarla (gr\'afico vectorial o vectorizado).
\begin{enumerate}
 \item 
Gr\'afico rasterizado: estructura o fichero de datos que representa una rejilla rectangular de pixeles (elementos que indican un color espec\'ifico). Esta rejilla permite conformar una imagen cuya calidad depender\'a de la cantidad de pixeles. Sus medidas (alto y ancho) son variables. Se suele utilizar este tipo de gr\'afico en fotograf\'ias y capturas de video. (Figura ~\ref{fig:grafico rasterizado}).
 \item
Gr\'afico vectorial o vectorizado: en este tipo de gr\'aficos se trabaja con informaci\'on geom\'etrica en coordenadas. Esta informaci\'on es utilizada para generar la imagen. Se utiliza en gr\'aficos t\'ecnicos. (Figura ~\ref{fig:grafico vectorial}).
\end{enumerate}

Para realizar gr\'aficos t\'ecnicos, en general, se utiliza el dise\~no asistido por computadora, nombrado CAD por sus siglas en ingl\'es (Computer Aided Design). El CAD es un tipo de programa que dispone de una interfaz gr\'afica intuitiva que brinda al usuario la posibilidad de dise\~nar formas geom\'etricas tanto predefinidas como libres. 



\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 360 210]{../fuente/Imagenes_mejoradas/tesis_grafico_rasterizado.jpg}
 \caption{Rejilla de pixeles del gr\'afico rasterizado.}
 \label{fig:grafico rasterizado}
 \hfill \hfil
 \centering
 \includegraphics[bb=0 0 360 290]{../fuente/Imagenes_mejoradas/tesis_grafico_vectorizado.png}
 \caption{Gr\'afico vectorial de una curva NURBS 3D con cuatro puntos de control.}
 \label{fig:grafico vectorial}
\end{figure}

Para el caso de las formas geom\'etricas libres se utilizan diferentes representaciones matem\'aticas, una de las cuales es la NURBS (Non Uniform Rational B-Splines). En este informe se introducir\'an las NURBS y se presentar\'a el an\'alisis y la implementaci\'on de un CAD simple que permite la creaci\'on y edici\'on de \'estas con la ventaja de manipular puntos en 3D mediante proyecciones sobre un plano m\'ovil en el espacio tridimensional.

	\section{Justificaci\'on del proyecto}

Actualmente existe una gran diversidad de programas que permiten la creaci\'on y edici\'on de superficies NURBS. Sin embargo, las aplicaciones pr\'acticas de dichos programas no siempre permiten la satisfacci\'on total de intereses y necesidades de la comunidad de usuarios, sobre todo teniendo en cuenta la imposibilidad de modificar las estructuras de dichos programas. El software comercial es un claro ejemplo de estas limitaciones.

El aporte de la presente investigaci\'on pretende facilitar herramientas simples a dicho grupo de usuarios, creando un software flexible que pueda ser modificado y adaptado por aquellos que posean el conocimiento adecuado. El software resultante tambi\'en dispondr\'a de una estructura que servir\'a como plantilla base para el f\'acil agregado de m\'odulos, otorgando la posibilidad de ampliar sus prestaciones b\'asicas en caso de ser necesario.

Se debe destacar que el presente proyecto estar\'a disponible para toda la comunidad.

Aunque existen numerosos programas CAD comerciales de prop\'osito general (como por ejemplo Autocad, Autocad Civil 3D, Autodesk 3ds Max, Autodesk Inventor, Autodesk Maya, Revit Architecture, entre otros); ninguno de ellos tiene como fin el mallado de superficies. Para modelar sistemas f\'isicos en la computadora mediante c\'alculo num\'erico (por ejemplo el m\'etodo de elementos fin\'itos) se resuelven las ecuaciones diferenciales en forma aproximada, pero para ello se debe subdividir el dominio en un conjunto de poliedros simples o "elementos finitos", el dominio real se modela en forma simplificada mediante una "malla de elementos finitos". Se pretende, que el software creado sirva de soporte a ge\-ne\-ra\-do\-res de mallas de superficies 3D.  

El mercado tambi\'en cuenta con software que permite la creaci\'on y edici\'on de NURBS y brinda su c\'odigo fuente. A pesar de esto, cuando se desea agregar o modificar una utilidad a alg\'un programa de este tipo, es necesario el estudio detallado de la estructura y codificaci\'on del mismo. \'Este proceso normalmente es tedioso, dif\'icil y demanda una gran cantidad de tiempo. A veces resulta incluso imposible modificar dichos programas para cubrir el objetivo que se intenta alcanzar. Por todo ello, este trabajo te\'orico – pr\'actico propone el desarrollo de un software propio que pueda adaptarse f\'acilmente a las necesidades locales. Tambi\'en es un intento de lograr que los algoritmos a desarrollar contribuyan al software que realiza post proceso en c\'alculos num\'ericos y simulaci\'on (visualizaci\'on de resultados) brindando la posibilidad de representar el dominio con una NURBS cuando as\'i sea necesario. 

	\section{Objetivos}

		\subsection{Objetivos Generales}

\begin{itemize}
 \item 
Desarrollar un programa que permita la creaci\'on y edici\'on de superficies NURBS 3D.
 \item
Contribuir con la comunidad cient\'ifica otorgando un material dise\~nado de origen para servir de soporte a generadores de mallas de superficies 3D.
\end{itemize}

		\subsection{Objetivos Espec\'ificos}

\begin{itemize}
 \item 
Desarrollar una t\'ecnica para manipular puntos en 3D mediante una entrada de datos en 2D (pantalla del monitor).
 \item 
Permitir la importaci\'on y exportaci\'on de objetos generados.
 \item 
Incorporar desarrollos previos o paralelos de una forma modular y a su vez permitir que este desarrollo se adicione en sistemas m\'as generales.
 \item 
Adquirir conocimientos en geometr\'ia computacional y desarrollo de software espec\'ifico.
 \item 
Colaborar con la comunidad cient\'ifica local exponiendo la fuente del software para libre disponibilidad.
\end{itemize}

%--------------------------------------

\setcounter{equation}{0}
\setcounter{section}{0}

\part{Marco Te\'orico}

	\section{NURBS}

Las NURBS \textendash Non Uniform Rational B-Splines \textendash son representaciones anal\'iticas de curvas y superficies.
En la Figura ~\ref{fig:curva y superficie nurbs} se pueden apreciar una curva y una superficie NURBS 3D. Para describir las NURBS es necesario introducir una serie de conceptos y definiciones. El orden de introducci\'on ser\'a:

\begin{enumerate}
 \item 
Representaci\'on de una curva o superficie.
 \item 
Curvas polin\'omicas y racionales.
 \item 
Splines o curvas polin\'omicas por tramos.
 \item 
B-Splines.
 \item 
Curvas y superficies NURBS.
\end{enumerate}


\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 300 233]{../fuente/Imagenes_mejoradas/tesis_curva_y_superficie_NURBS.png}
 % curvaNURBS_01.png: 640x318 pixel, 72dpi, 22.58x11.22 cm, bb=0 0 640 318
 \caption{Gr\'afico vectorial de una curva y una superficie NURBS 3D.}
 \label{fig:curva y superficie nurbs} 
\end{figure}

		\subsection{Representaci\'on de curvas y superficies}

En el modelado geom\'etrico, las formas m\'as comunes de representar curvas y superficies son: 
\begin{enumerate}
 \item 
La forma impl\'icita.
 \item
La forma param\'etrica.
\end{enumerate}
En esta \'ultima, cada una de las coordenadas de una curva es representada se\-pa\-ra\-da\-men\-te como una funci\'on expl\'icita de un par\'ametro ``u'' independiente, o dos par\'ametros ``u,v'' independientes en el caso de una superficie. La forma param\'etrica es la utilizada para representar NURBS.\\

Una curva en forma param\'etrica se  representa de la siguiente manera :
\begin{equation} \label{curva_parametrica}
C(u) = (x(u),y(u),z(u)) \; \; , \; \;  a \leq u \leq b
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}\\
Donde a y b son n\'umeros reales y ``u'' es el par\'ametro independiente.

Una superficie:
\begin{equation} \label{superficie_parametrica}
C(u,v) = (x(u,v),y(u,v),z(u,v)) \; , \; \; a \leq u \leq b , c \leq v \leq d
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}
Donde a, b, c y d son n\'umeros reales y ``u,v'' son los par\'ametros independientes.

Estas funciones son arbitrarias. De este modo, es posible formar una gran variedad de curvas y superficies con ellas. Es conveniente restringir las funciones para que posean algunas propiedades, como por ejemplo:
\begin{itemize}
 \item 
Capacidad de representar las curvas o superficies que el usuario necesite.
 \item
Capacidad de ser calculadas de forma eficiente por medio de un algoritmo computacional.
 \item  
Simpleza en sus f\'ormulas matem\'aticas.
\end{itemize}

Las funciones utilizadas, generalmente, son las polin\'omicas. Sin embargo, \'estas no  pueden representar el conjunto entero de curvas y superficies. Por ende, satisfacen s\'olo las \'ultimas dos propiedades mencionadas.

Por ahora s\'olo se har\'a referencia a las curvas, debido a que su explicaci\'on es m\'as simple. \'Esto implicar\'a un car\'acter m\'as did\'actico. Al final del apartado se extender\'a hacia las superficies.

		\subsection{Curvas polin\'omicas y racionales}

Las curvas polin\'omicas son aquellas que, en su forma param\'etrica, tienen sus coordenadas representadas por funciones que son polinomios. Existen varios m\'etodos para representar este tipo de curvas, uno de ellos por ejemplo es el m\'etodo de Bezier.

Una curva de Bezier se define mediante sus puntos de control que a su vez aproximan la forma de la curva. El grado de la curva est\'a determinado por la cantidad de puntos de control.

Una curva de B\'ezier de grado n es expresada de la siguiente manera:

\begin{equation} \label{superficie_parametrica}
C(u)=\sum_{i=0}^{n}{B_{i,n}(u)P_{i}}
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

Donde: 

$i=0...n$ 
, \ 

$u\in[{0,1}]$ es el par\'ametro independiente,

$P_{i}$ son los puntos de control,

$B_{i,n}(u)$ denominadas blending functions, son los polinomios de Bernstein.\\

De este modo, definiendo los puntos de control de la curva de Bezier como par\'ametros principales y variando el par\'ametro independiente ``u'' se calculan los puntos de la curva.

Las curvas de Bezier son una combinaci\'on af\'in convexa de los puntos de control donde los pesos son los polinomios de Bernstein. (Una combinaci\'on af\'in de puntos es un promedio ponderado de los puntos y la combinaci\'on es convexa cuando los pesos se mantienen en el intervalo [0,1]). 

Esta propiedad implica que los puntos resultantes de una curva de Bezier estar\'an contenidos en el envoltorio convexo (figura que se formar\'ia si soltamos una banda el\'astica sobre los puntos de control). Adem\'as, la curva tendr\'a invariancia af\'in, es decir, ante una transformaci\'on af\'in (lineal y traslaci\'on) s\'olo hay que transformar sus puntos de control y reconstruirla en lugar de tener que transformar todos los puntos de la curva. En la Figura ~\ref{fig:curva bezier} puede apreciarse una curva de Bezier con sus respectivas partes.

\begin{figure}[H]
 \centering
 \includegraphics[bb= 0 0 300 219]{../fuente/Imagenes_mejoradas/tesis_bezier_puntos_de_control.jpg}
 \caption{Una curva de Bezier con cuatro puntos de control.}
 \label{fig:curva bezier}
 % bezier_puntos de control.jpg: 1179666x1179666 pixel, 0dpi, infxinf cm, bb=
\end{figure}

Los polinomios de Bernstein (de grado n) est\'an definidos por la siguiente
ecuaci\'on:

\begin{equation}
{B_{{{{i,n}}}}\left(u\right)=\frac{{{n!}}}{{{i!}}\left(n-i\right)!}u^{{i}}\left(1-u\right)^{{n-i}}} \; \; ; u \in [0,1]
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}} 
\label{equation:pol_bernstein}
\end{equation}

\bigskip

Algunas de sus propiedades son:


\begin{itemize}
\item  ${\sum_{i=0}^{n}
{B_{{{{i,n}}}}\left(u\right)}=1}$
\item 
${B_{{{0,}n}}\left(0\right){{=B}}_{{{{n,n}}}}\left(1\right)=1}
$
\item 
Propiedad recursiva
\begin{equation} \label{equation:pol_rec_bernstein}
{B_{{{{i,n}}}}\left(u\right)=\left(1-u\right)B_{{{{i,n}}-1}}\left(u\right){{+uB}}_{{i-{{1,n}}-1}}\left(u\right)}
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}
\ donde  ${B_{{{{i,n}}}}\left(u\right)=0} \; \; $ si 
$\; \; {{{i{<}}}0}\; \; $ o 
$\; \; {{{i{>}n}}}$
\end{itemize}



\bigskip

Si denotamos a una curva de B\'ezier de grado n en funci\'on de sus
puntos de control como:

\bigskip

\[{C_{{n}}\left(P_{{{0,}{.}{.}{.}}}{{,P}}_{{n}}\right)}\]

\bigskip

Por la definici\'on recursiva de los polinomios de Bernstein (\arabic{section}.~\ref{equation:pol_rec_bernstein}) tenemos
que la curva tambi\'en es recursiva. 

\[{C_{{n}}\left(P_{{{0,}{.}{.}{.}}}{{,P}}_{{n}}\right)=\left(1-u\right)C_{{n-1}}\left(P_{{{0,}{.}{.}{.}}}{{,P}}_{{n-1}}\right){{+uC}}_{{n-1}}\left(P_{{{1,}{.}{.}{.}}}{{,P}}_{{n}}\right)}\]

\bigskip


Esta definici\'on indica que una curva de B\'ezier de grado n es una
interpolaci\'on lineal entre dos curvas de B\'ezier de un grado menor.
Considerando que, de los n+1 puntos de control de la curva resultante, la
primer curva toma los n puntos de control iniciales y la segunda toma
los n puntos de control finales.

Si, adem\'as, se toma un valor arbitrario de $u$ como $u_0$ donde  $u_0\in[0,1]$, y denotamos a $P_i$ como $P_{0,i}$ obtenemos el algoritmo recursivo
para obtener un punto de la curva con el par\'ametro independiente $u_0$. 
Esto es,
$C(u_0)=P_{n,0}(u_0)$ partiendo que una curva de B\'ezier de grado cero es el conjunto de
puntos de control.

Es posible, entonces, escribir el siguiente algoritmo
recursivo:

\begin{equation} \label{ecuacion_recursiva}
P_{k,i}(u_0)=(1-u_0)P_{{k-1},i}(u_0)+u_{0}P_{{k-1},{i+1}}(u_0) 
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}
Donde:
\begin{eqnarray}
\nonumber {{{k=}}{1,}{.}{.}{.}{{,n}}} \\
\nonumber {{{i=}}{0,}{.}{.}{.}{{,n}}-k}
\end{eqnarray}


\'Este es el algoritmo de De Casteljau y es generalmente el m\'as usado para calcular una curva de B\'ezier en una computadora. (Para obtener mas informaci\'on acerca de este algoritmo ver \cite{Boeh84},\cite{deCa86},\cite{deCa93}).\\

Las curvas de Bezier tienen algunas propiedades que merecen ser mencionadas:
\begin{itemize}
 \item 
El pol\'igono que forman los puntos de control desde $P_0$ hasta $P_n$ se llama pol\'igono de control.
 \item
El pol\'igono de control se aproxima a la forma de la curva.
 \item
La curva interpola el primer y \'ultimo punto de control cuando el par\'ametro independiente es 0 y 1 respectivamente.
 \item
Las direcciones tangentes a la curva en sus puntos iniciales y finales son paralelos a los vectores que forman $P_1 - P_0$ y $P_n - P_{n-1}$ respectivamente.
 \item
La curva esta contenida en el envoltorio convexo de los puntos de control.
\end{itemize}


Como se ha mencionado anteriormente, existen curvas y superficies que no pueden ser representadas con polinomios. Algunos casos son las curvas y superficies c\'onicas (c\'irculos, elipses, hip\'erbolas, cilindros, conos, esferas, etc). Sin embargo \'estas s\'i pueden ser representadas mediante funciones racionales (cocientes de polinomios).

Las curvas racionales son el resultado de la proyecci\'on perspectiva de una curva con una dimensi\'on m\'as. La curva se define en coordenadas homog\'eneas $\mathbb{R}^{d+1}$ (donde llamamos $w$ a la coordenada $d+1$) pero se dibuja en el espacio proyectivo ${P}^{d}$ dividiendo por el polinomio $w(u)$. La demostraci\'on de esta interpretaci\'on puede observarse en \cite{lesPieg}.

Una curva de B\'ezier racional de grado n queda definida de la siguiente manera:

\begin{equation}\label{bezier_racional}
 C(u)=\frac{\sum_{i=0}^{n}{B_{i,n}(u)w_{i}P_{i}}}{\sum_{i=0}^{n}{B_{i,n}(u)w_i}}, \; \; 0 \leqq u \leqq 1
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

Donde los puntos $P_i$ y los polinomios $B_{i,n}(u)$ son los mismos que ya han sido definidos previamente y los $w_i$, tambi\'en denominados pesos, son escalares que corresponden a la coordenada $d+1$. Estos pesos son considerados positivos para asegurar que el denominador en (\arabic{section}.~\ref{bezier_racional}) no ser\'a cero.

		\subsection{Splines o curvas por tramos}

La modificaci\'on de uno de los puntos de control de una curva de Bezier afecta a toda la curva. Esta propiedad es llamada control global de la curva y es indeseable en CAGD (Computer Aided Geometric Design) ya que para modelar una forma geom\'etrica libre es conveniente hacer aproximaciones locales.

En distintas ocasiones es necesario modelar formas m\'as complejas. Para ha\-cer\-lo mediante una curva de Bezier se deber\'a aumentar el grado de dicha curva. Si el grado se vuelve muy elevado, el coste computacional ser\'a mayor. 

Para resolver este inconveniente, se tiene que el mismo efecto podr\'ia lograrse si una curva es considerada como la uni\'on de varias curvas de grados menores. Por ejemplo se podr\'ia definir una nueva curva continua como la uni\'on de varias curvas de B\'ezier. 

La curva resultante de la uni\'on de varias curvas polin\'omicas simples, cumpliendo una serie de requisitos de continuidad en las uniones, es llamada spline.

En la Figura ~\ref{fig:spline1} (obtenida de \cite{lesPieg}) se puede apreciar una curva spline $C(u)$ que est\'a formada por segmentos polinomiales de grado $m$ con $m = 3$. \\

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 300 214]{../fuente/Imagenes_mejoradas/tesis_spline_1.jpg}
 \caption{Spline 1 con tres segmentos polinomiales.}
 \label{fig:spline1}
\end{figure}

Es necesario aclarar una serie de conceptos y definiciones:
\begin{itemize}
 \item 
$C_i(u)$ est\'a definida con $u\in[0,1]$.
 \item 
Se denomina knots o nodos a los valores (n\'umeros reales) de los par\'ametros $u_0 = 0 \leqq u_1 \leqq u_2 \leqq u_3 = 1$.
 \item 
Se denominan knot vector o vector de nodos a el  conjunto de knots ubicados en orden creciente $(u_{i+1}-u_{i}\geq 0)$.
 \item 
Se denomina i-\'esimo knot span al intervalo semi abierto $[u_i,u_{i+1})$. 
 \item 
La curva spline es uniforme si la secuencia de nodos se encuentra equiespaciada, es decir, $u_i - u_{i+1} = cte$  con $i=0,...,m-1$ , en caso contrario es no uniforme. 
 \item 
Los segmentos polinomiales ser\'an denotados $C_{i}(u)$, $1\leqq i \leqq m$.
\end{itemize}

En la Figura ~\ref{fig:spline1} el knot vector es $U=\left\{{u_0,u_1,u_2,u_3}\right\}$.\\

Los segmentos polinomiales est\'an unidos con un nivel de continuidad. Si se indica con $\frac{d^jC_i(u)}{du^j} $ a la j-\'esima derivada de $C_i$, entonces $C_{i}(u)$ tiene continuidad param\'etrica $C^k$ en el knot $u_i$ si $\frac{d^jC_i(u_i)}{du^j} = \frac{d^jC_{i+1}(u_i)}{du^j}$ para todo $j \leqq k$. Es decir, en los puntos de uni\'on las derivadas deben ser iguales para ambos segmentos de curva. Sin embargo, en CAGD la continuidad m\'as importante es la geom\'etrica o visual $G^k$ que implica que las derivadas en las uniones sean proporcionales, esto es $\frac{d^jC_i(u_i)}{du^j} = \alpha \frac{d^jC_{i+1}(u_i)}{du^j}$ con $\alpha > 0$.

Como ya se ha mencionado, cualquier forma polinomial puede ser usada para representar las curvas $C_i(u)$. Por ejemplo en la Figura ~\ref{fig:spline2} (obtenida de \cite{lesPieg}) se puede observar la curva spline con tres segmentos representados con curvas de B\'ezier c\'ubicas donde $P_i^j$ denota el i-\'esimo punto de control del j-\'esimo segmento. 

\begin{figure}[H]
\centering
 \includegraphics[bb=0 0 300 214]{../fuente/Imagenes_mejoradas/tesis_spline_2.jpg}
 \caption{Spline 2 con tres segmentos polinomiales.}
 \label{fig:spline2} 
% capitulo3_figura1.jpg: 410x293 pixel, 72dpi, 14.46x10.34 cm, bb=0 0 410 293
\end{figure}

Considerando que cada curva de Bezier de grado 3 dispone de 4 puntos de control, se tiene que la spline dispondr\'a de 12 puntos de control. Sin embargo, estableciendo que los segmentos tienen continuidad  $G^0$, es decir, los puntos de control en las uniones son iguales, se concluye que la misma curva queda definida con 10 puntos de control. Si, adem\'as, se establece que los segmentos tienen $C^1$ se concluye que algunos puntos de control pueden ser expresados en t\'erminos de otros resultando as\'i que la curva quede definida con menos puntos de control, 8 en este caso.

Por lo mencionado anteriormente, manipular segmentos polin\'omicos in\-di\-vi\-dua\-les no es conveniente ya que implica un cierto nivel de redundancia en el almacenamiento de datos.

Es posible expresar la misma curva de la siguiente manera:

\begin{equation}
 C(u)=\sum_{i=0}^{n}{f_i(u)P_i}
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}


Donde $f_i(u)$ con $i=0,...,n$ son funciones polinomiales que forman una base y que, combinadas con otro conjunto (m\'as reducido) de puntos de control $P_i$, pueden remover las redundancias mencionadas anteriormente.
Eligiendo correctamente estas funciones es posible lograr un cierto nivel y grado de continuidad en las uniones y obtener curvas polinomiales por tramos tanto racionales como polin\'omicas.

		\subsection{B-splines}

Con un determinado conjunto de bases obtenemos las B-Splines.

La funci\'on base B-Spline i-\'esima de grado p denotada como $N_{i,p}(u)$ es definida de la siguiente manera:

\begin{equation}
{N_{i,0}}\left(u\right)=1\ \; \; {\text{si}}\; \;  u_{i}\leqq
 u < u_{i+1}
\nonumber
\end{equation}

\begin{equation}
 {N_{{i{,0}}}\left(u\right)=0\ \; \; {\text{en caso
contrario}}}
 \nonumber
\end{equation}

\begin{equation}\label{bspline}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)=\frac{u-u_{{i}}}{u_{{\normalsubformula{\text{i+p}}}}-u_{{i}}}N_{{\normalsubformula{\text{i,p}}-1}}\left(u\right)+\frac{u_{{\normalsubformula{\text{i+p+}}1}}-u}{u_{{\normalsubformula{\text{i+p+}}1}}-u_{{\normalsubformula{\text{i+}}1}}}N_{{\normalsubformula{\text{i+}}\text{1,}p-1}}\left(u\right)}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}
\bigskip

En el caso de que la ecuaci\'on \arabic{section}.~\ref{bspline} sea una divisi\'on por cero, se considerar\'a el resultado igual a cero.

\bigskip
\bigskip

\clearpage

\textbf{Curvas B-Spline}\\

Una curva B-Spline de grado p (con n+1 puntos de control) est\'a definida de la siguiente manera:

\begin{equation}
{C\left(u\right)=\sum_{i=0}^{n}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)P_{{i}}}} \; \; \; \; \; 
\text{con} \; \; {a\le u\le b}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

Con un knot vector de tama\~no m+1:
\begin{eqnarray}
{\normalsubformula{\text{U=}}\left\{u_{{\text{0,}}}u_{{\text{1,}\text{.}\text{.}\text{.}}}\normalsubformula{,u}_{{m}}\right\}}
\nonumber
\end{eqnarray}

con 
${\;u_{{\normalsubformula{\text{i+}}1}}\normalsubformula{-u}_{{i}}\ge
0}$; 


\bigskip
\bigskip

\textbf{Superficies B-Spline}\\

Para la construcci\'on de una superficie las bases son las mismas y su
f\'ormula similar. Una superficie B-Spline queda definida tomando un conjunto bidireccional de puntos de control y dos knot vectors. En este caso las funciones var\'ian con respecto a
dos par\'ametros  ``$u,v$'' y la f\'ormula
 de una superficie B-Spline de grado n (en la direcci\'on $u$) y q (en la direcci\'on $v$) queda definida de la siguiente manera:


\bigskip
\begin{equation}
 {S\left(\normalsubformula{\text{u,v}}\right)=\sum_{i=0}^{n} {\sum_{j=0}^{m}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)N_{{\normalsubformula{\text{j,q}}}}\left(v\right)P_{{\normalsubformula{\text{i,j}}}}}}}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

\bigskip

Con dos knot vectors U y V de tama\~nos $r+1$ y $s+1$ respectivamente. Donde $r = n+p+1$ y $s=m+q+1$.

\bigskip

Para un valor dado del par\'ametro ${v}$ fijo se obtiene una curva (isoparam\'etrica)
con ${u}$ variable, y lo mismo sucede si se fija ${u}$. La superficie puede pensarse como una combinaci\'on de curvas, en el mismo sentido en que las curvas son combinaciones de puntos de control.

		\subsection{Curvas y superficies NURBS}

Finalmente al combinar estos conceptos y definiciones es posible definir una NURBS.
Una NURBS es una spline con las funciones bases B-Spline que tiene la posibilidad de ser racional y que a su vez dispone de un knot vector que puede ser no uniforme.

Se define una curva NURBS de grado p de la siguiente manera:


\bigskip

\begin{equation}\label{eq:cnurb}
{C\left(u\right)=\frac{\sum_{i=0}^{n}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)w_{{i}}P_{{i}}}}{\sum_{i=0}^{n}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)w_{{i}}}}} \; \; \; \text{con } 
{a\le u\le b}
\renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

Donde: 

\begin{itemize}
 \item 
${P_{{i}}}$ son los \textit{puntos de control}
 \item 
${w_{{i}}}$ son los \textit{pesos} 
\item 
el grado, $p$, la cantidad de puntos de control, $n+1$, y la cantidad de knots, $m+1$, est\'an relacionado de la siguiente manera: $m = n + p +1$ 
\item 
 ${N_{{\normalsubformula{\text{i,p}}}}\left(u\right)}$ son las funciones
bases B-Spline
 \item 
en general, adem\'as, se asume que  $a=0$ , $b=1$  y  ${w_{{i}}>0\forall i}$
\end{itemize}



\bigskip

Si se desea que el primer y el \'ultimo punto de control interpolen con
la curva se necesita un knot vector en donde los valores de los
primeros p+1 knots sean los mismos, es decir:

\[{\normalsubformula{\text{U=}}\left\{\underbrace{\normalsubformula{\text{a,}}\text{.}\text{.}\text{.}\normalsubformula{\text{,a}}}_{\normalsubformula{\text{p+}}1}\normalsubformula{\text{,u}}_{{\normalsubformula{\text{p+1}}}},\text{.}\text{.}\text{.}\normalsubformula{\text{,u}}_{{m-p-1}},\underbrace{\normalsubformula{\text{b,}}\text{.}\text{.}\text{.}\normalsubformula{\text{,b}}}_{\normalsubformula{\text{p+}}1}\right\}}\]


Definiendo
\begin{equation}
{R_{{\normalsubformula{\text{i,p}}}}\left(u\right)=\frac{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)w_{{i}}}{\sum_{j=0}^{n}
{N_{{\normalsubformula{\text{j,p}}}}\left(u\right)w_{{j}}}}}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

\bigskip

Es posible reescribir (\arabic{section}.~\ref{eq:cnurb}) de la siguiente forma:
\begin{equation}
{C\left(u\right)=\sum_{i=0}^{n}
{R_{{\normalsubformula{\text{i,p}}}}\left(u\right)P_{{i}}}}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}


\bigskip

Donde ${R_{{\normalsubformula{\text{i,p}}}}\left(u\right)}$ son
funciones bases racionales por tramos en el intervalo [0,1]. 


\bigskip

Procediendo de la misma manera se tiene que la f\'ormula de una
superficie NURBS de grado p en la direcci\'on $u$ y grado q en la direcci\'on $v$ puede escribirse como:\\
\begin{equation}
{S\left(\normalsubformula{\text{u,v}}\right)=\frac{\sum_{i=0}^{n} {\sum_{j=0}^{m}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)N_{{\normalsubformula{\text{j,q}}}}\left(v\right)w_{{\normalsubformula{\text{i,j}}}}P_{{\normalsubformula{\text{i,j}}}}}}}{\sum_{i=0}^{n}
{\sum_{j=0}^{m}
{N_{{\normalsubformula{\text{i,p}}}}\left(u\right)N_{{\normalsubformula{\text{j,q}}}}\left(v\right)w_{{\normalsubformula{\text{i,j}}}}}}}}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

\bigskip

Donde $P_{i,j}$ es un conjunto bidireccional de puntos de control, $w_{i,j}$ son los pesos y los knot vectors U y V son de tama\~nos $r+1$ y $s+1$ respectivamente. Donde $r = n+p+1$ y $s=m+q+1$.

\bigskip

Se concluye que las NURBS est\'an definidas por cuatro par\'ametros
fundamentales: el grado, los puntos de control, los knots y una regla
de evaluaci\'on. Este \'ultimo par\'ametro son las funciones bases
B-Spline que utilizan los otros tres par\'ametros para devolver los
resultados que representan a una curva (o superficie).

Las NURBS pueden representar curvas (o superficies) c\'onicas, tienen
control local y utilizan pocos datos para obtener dichas
representaciones. \'Estas son de inter\'es para la comunidad del
dise\~no asistido por computadora ya que cada vez m\'as son adoptadas
en diferentes \'ambitos (como las artes visuales, la industria del
entretenimiento y el modelado de objetos que necesitan ser
representados por formas geom\'etricas libres).  Es posible obtener m\'as informaci\'on sobre las NURBS en \cite{sederberg} y \cite{ribo}.

\clearpage

	\section{GUI (Graphical User Interface): Interf\'az gr\'afica de usuario}

		\subsection{Definici\'on y Utilidad}

Un CAD permite al usuario generar, manipular y visualizar objetos generados. El ingreso de los datos desde el teclado es engorroso por lo tanto se utilizan m\'etodos gr\'aficos. Una interfaz gr\'afica es el componente de una aplicaci\'on inform\'atica mediante la cual el usuario interact\'ua con el sistema. Se compone de distintas met\'aforas gr\'aficas que facilitan el aprendizaje del sistema y agilizan el trabajo al usuario.

La curva o superficie que una NURBS representa no es facilmente interpretada por sus par\'ametros; sin embargo, si un CAD permite la visualizaci\'on de estas re\-pre\-sen\-ta\-cio\-nes por medio de un gr\'afico, la edici\'on de la NURBS podr\'a realizarse de una manera m\'as sencilla.

A modo de explicaci\'on se presentar\'an los datos de una superficie NURBS 3D con una rejilla de 4X3 puntos de control y un knot vector dado en las direcciones $u$ y $v$ y luego una figura que la representa.\\

Puntos de control:
\begin{itemize}
\item 
Pto(0,0) = (0.76, 0.70, 0.54)
\item 
Pto(0,1) = (0.16, 2.00, 2.10)
\item 
Pto(0,2) = (0.05, 2.81, -0.76)
\item 
Pto(1,0) = (1.74, 1.18, -0.48)
\item 
Pto(1,1) = (0.57, 2.21, -2.09)
\item 
Pto(1,2) = (0.05, 2.67, -2.81)
\item 
Pto(2,0) = (3.08, 1.31, -0.63)
\item 
Pto(2,1) = (2.66, 2.57, -2.41)
\item 
Pto(2,2) = (2.47, 3.14, -3.21)
\item 
Pto(3.0) = (4.19, 0.77, 0.58)
\item 
Pto(3,1) = (5.94, 2.26, 0.95)
\item 
Pto(3.2) = (4.72, 3.09, -0.87)
\end{itemize}

Knot vector en la direcci\'on $u$:

$\; \; \; \; \; \; \; \; [0.00, 0.00, 0.05, 0.10, 0.90, 0.95, 1.00, 1.00]$

Knot vector en la direcci\'on $V$:

$\; \; \; \; \; \; \; \; [0.00, 0.00, 0.20, 0.80, 1.00, 1.00]$

Grado en la direcci\'on $V$: 1

Grado en la direcci\'on $U$: 3\\



El gr\'afico de esta superficie NURBS 3D con los par\'ametros mencionados rea\-li\-za\-da con un CAD permite al usuario interpretarla con una mayor claridad. En la Figura ~\ref{fig:nurbs con el cad1} puede apreciarse la superficie NURBS 3D con los par\'ametros detallados anteriormente. 

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 268]{../fuente/Imagenes_mejoradas/tesis_nurbs_en_CAD_01.png}
 \caption{Gr\'afico de una superficie NURBS 3D (realizado con el CAD de\-sa\-rro\-lla\-do) tomando los puntos de control mencionados.}
 \label{fig:nurbs con el cad1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Editando los puntos de control es posible modificar la forma de la superficie; a pesar de esto, tambi\'en es posible cambiar su forma editando los valores del knot vector. La Figura ~\ref{fig:nurbs con el cad2} muestra una superficie con los mismos puntos de control y grados pero con los siguientes knot vectors:

Knot vector en la direcci\'on $u$:

$\; \; \; \; \; \; \; \; [0.00, 0.00, 0.30, 0.70, 0.90, 0.95, 1.00, 1.00]$

Knot vector en la direcci\'on $V$:

$\; \; \; \; \; \; \; \; [0.00, 0.40, 0.55, 0.65, 1.00, 1.00]$

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 304]{../fuente/Imagenes_mejoradas/tesis_nurbs_en_CAD_02.png}
 \caption{Gr\'afico de una superficie NURBS 3D con los mismos puntos de control que la superficie de la Figura ~\ref{fig:nurbs con el cad1} pero con el knot vector editado.}
 \label{fig:nurbs con el cad2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\bigskip

Procediendo de manera similar tambi\'en es posible modificar la forma de una curva o superficie NURBS 3D modificando su grado. A modo de explicaci\'on se presentar\'a una curva NURBS 3D de 5x1 puntos de control con los grados: 1,2,3 y 4. Cabe aclarar que el grado m\'aximo que puede tomar es 4 donde se convierte en una curva de Bezier. En las Figuras  ~\ref{fig:curva_1}, ~\ref{fig:curva_2}, ~\ref{fig:curva_3} y ~\ref{fig:curva_4} es posible observar dichos cambios.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 250 191]{../fuente/Imagenes_mejoradas/tesis_curva_grado_1.png}
 \caption{Curva NURBS 3D de grado 1 en la direcci\'on $U$.}
 \label{fig:curva_1}
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 250 190]{../fuente/Imagenes_mejoradas/tesis_curva_grado_2.png}
 \caption{Curva NURBS 3D de grado 2 en la direcci\'on $U$.}
 \label{fig:curva_2}
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 250 190]{../fuente/Imagenes_mejoradas/tesis_curva_grado_3.png}
 \caption{Curva NURBS 3D de grado 3 en la direcci\'on $U$.}
 \label{fig:curva_3}
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 250 190]{../fuente/Imagenes_mejoradas/tesis_curva_grado_4.png}
 \caption{Curva NURBS 3D de grado 4 en la direcci\'on $U$.}
 \label{fig:curva_4}
\end{figure}

		\subsection{\'Areas de la interf\'az}

La interfaz gr\'afica del sistema ha sido desarrollada con GTK (conjunto de bi\-blio\-te\-cas multiplataforma para desarrollar interfaces gr\'aficas). Esta interfaz presenta cuatro \'areas bien definidas (Figura ~\ref{fig:partes cad}):
\begin{enumerate}
 \item 
\'Arbol de objetos: lista los objetos que han sido creados.
 \item
Propiedades de un objeto: lista las propiedades del objeto seleccionado.
 \item
Funciones de un objeto: lista las funciones que dispone un objeto seleccionado.
 \item
\'Area de trabajo: \'area que permite al usuario visualizar y manipular los objetos generados. 
\end{enumerate}

\begin{figure}
 \centering
 \includegraphics[bb=0 0 400 207]{../fuente/Imagenes_mejoradas/tesis_interfaz.png}
 \caption{Partes de la interfaz CAD desarrollada.}
 \label{fig:partes cad}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}


		\subsection{Escena y proyecci\'on}

OpenGL es un API -Application Programming Interface- multiplataforma que consiste en una serie de funciones y m\'etodos de bajo nivel para generar modelos geom\'etricos en 2D y 3D mediante una serie de primitivas geom\'etricas (puntos, lineas y pol\'igonos).

El \'area de trabajo utiliza OpenGL para generar, visualizar y manipular la escena. GTK proporciona esta funcionalidad incorporando una extensi\'on llamada ``GtkGlExt'' la cual adiciona objetos a los ya predefinidos en la biblioteca est\'andar.

La Figura ~\ref{fig:esfera} ha sido generada con OpenGL. \'Esta consiste en la representaci\'on de una esfera. Este elemento es el modelo. Dicho modelo, en conjunto con otros elementos como las luces, conforman la escena. OpengGL interpreta estos objetos, que han sido generados en un sistema de coordenadas en 3D y, realizando previamente un conjunto de transformaciones, los muestra en 2D (la pantalla plana del monitor). Estas transformaciones son: viewing transformation, modeling transformation, projection transformation y viewport transformation.

\begin{figure}
 \centering
 \includegraphics[bb=0 0 400 249]{../fuente/Imagenes_mejoradas/tesis_esfera.png}
 \caption{Gr\'afico de una esfera en el \'area de trabajo.}
 \label{fig:esfera}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}


Para OpenGL, el observador de la escena es an\'alogo a una c\'amara fotogr\'afica. \'Esta debe colocarse  apuntando hacia la escena (viewing transformation), posicionar los objetos en la escena (modeling transformation), elegir los lentes de la c\'amara o ajustar el zoom de la c\'amara (projection transformation) y, por \'ultimo, determinar el tama\~no de fotograf\'ia que se desea obtener (viewport transformation). Una vez realizado estos pasos es posible tomar la fotograf\'ia y obtener el resultado (visualizaci\'on de la escena). En la Figura ~\ref{fig:transformaciones} extraida de \cite{redbook} es posible apreciar estos pasos.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 277 444]{../fuente/Imagenes_mejoradas/tesis_transforaciones.png}
 \caption{Transformaciones realizadas por OpengGL.}
 \label{fig:transformaciones}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Los prop\'ositos de la projection transformation son: 
\begin{itemize}
 \item 
Definir qu\'e objetos o porciones de objetos formaran parte de la imagen final.
 \item 
Proyectar estos objetos sobre la pantalla. 
\end{itemize}

Esta  transformaci\'on puede ser una proyecci\'on ortogonal o una proyecci\'on en perspectiva. Para ambos casos se debe formar un viewing volume (volumen) donde aquellos objetos contenidos en \'este ser\'an los proyectados y, por ende, visualizados. 

			\subsubsection{Proyecci\'on Ortogonal}

El viewing volume de la proyecci\'on ortogonal es un paralelep\'ipedo donde el plano m\'as cercano a la c\'amara es del mismo tama\~no que el plano m\'as alejado de la c\'amara. De este modo, el tama\~no con el que se proyectar\'a un objeto no se encuentra determinado por su distancia con respecto a la c\'amara. El viewing volume de esta proyecci\'on se puede apreciar en la Figura ~\ref{fig:ortogonal}  extraida de \cite{redbook}.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 372 230]{../fuente/Imagenes_mejoradas/tesis_proyeccion_ortogonal.png}
 \caption{Proyecci\'on ortogonal de OpenGL.}
 \label{fig:ortogonal}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

			\subsubsection{Modelo de la c\'amara de caj\'on}

El modelo de la c\'amara de caj\'on utiliza la proyecci\'on en perspectiva para la projection transformation. La proyecci\'on en perspectiva muestra m\'as peque\~nos a los objetos que est\'an mas alejados de la c\'amara. Esto se debe a que el viewing vo\-lu\-me es un frustum, es decir, una pir\'amide truncada cuyo tope ha sido cortado con un plano paralelo a la base. Los objetos que se encuentran dentro de este volumen ser\'an proyectados sobre el plano que est\'a en el tope de la pir\'amide. Esta proyecci\'on es lo que se ver\'a en la pantalla.

En la Figura ~\ref{fig:perspectiva} extraida de \cite{redbook} se muestra el frustum de una proyecci\'on en perspectiva. Se pueden apreciar el plano base y el plano tope (especificados por la distancia – near y  far - desde el observador) y los par\'ametros left, right, top y botton que indican por donde pasar\'a la pir\'amide.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 372 230]{../fuente/Imagenes_mejoradas/tesis_perspective_frustum.png}
 \caption{Frustum de la Proyecci\'on en perspectiva de OpenGL.}
 \label{fig:perspectiva}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

No es sencillo ubicar estos par\'ametros correctamente. Sin embargo, utilizando una funci\'on de la librer\'ia de utilidad de OpenGL (GLU) es posible representar esta proyecci\'on de una manera m\'as simple, en la cual se debe indicar el \'angulo $\varTheta$ de inclinaci\'on de la pir\'amide, la relaci\'on del  ancho (w) y alto (h) del plano tope y los ya mencionados 
valores de near y far. Esto puede apreciarse en la Figura ~\ref{fig:perspectiva2}.

\begin{figure}
 \centering
 \includegraphics[bb=0 0 370 162]{../fuente/Imagenes_mejoradas/tesis_proyeccion_en_perspectiva.png}
 \caption{Proyecci\'on en perspectiva de OpenGL indicando nuevos par\'ametros.}
 \label{fig:perspectiva2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

		\subsection{Manipulaci\'on virtual del modelo: Plano m\'ovil}

Como ya se ha mencionado, OpenGL interpreta puntos en 3D y los representa en 2D. El usuario interact\'ua con el sistema a trav\'es del mouse. El cursor del mouse, cuando se encuentra posicionado sobre la pantalla define un punto en 2D ya que \'esta es plana. A su vez, representa infinitos puntos en 3D en el sistema de coordenadas ya que define una linea imaginaria que parte desde el ojo del observador y pasa por el punto en 2D del cursor. En la Figura ~\ref{fig:linea_imaginaria1} y la Figura ~\ref{fig:linea_imaginaria2} pueden apreciarse el puntero y la linea que \'este representa. Para seleccionar, mover o e\-di\-tar un objeto, cambiar el punto de vista del observador, entre otras funciones es necesario interpretar el punto de la pantalla en 2D e identificar que punto en 3D representa.

 Para identificar un punto en 3D el usuario tiene varias alternativas, \'estas se detallan a continuaci\'on: 
\begin{enumerate}
 \item 
La entrada de datos por medio del teclado (ingresar las coordenadas de un punto y luego visualizarlo). Esta opci\'on permite que los datos sean precisos pero no ser\'a adecuada en el caso de que se desee visualizar cambios de una manera fluida.
 \item 
Utilizar una funci\'on de OpenGL (gluUnProject) que, ingresando como par\'ametro las coordenadas en 2D de un punto de la pantalla, devuelve las coordenadas de un punto en 3D (punto intersectado en la base del frustum). Sin embargo, esta opci\'on no permite disponer de un control intuitivo cuando se realiza el movimiento del mouse. 
 \item 
Proponer un plano en 3D manipulable denominado plano m\'ovil y con\-si\-de\-rar que la entrada de datos se corresponde con los puntos intersectados por una linea recta en dicho plano. La recta propuesta es aquella que pasa por el punto indicado por el ojo del observador y el punto del puntero del mouse (obtenido por medio de la funci\'on gluUnProject). En la Figura ~\ref{fig:linea_imaginaria3} y la Figura ~\ref{fig:linea_imaginaria4} se indica como la recta intersecta al plano pro\-pues\-to y define un \'unico punto (dato ingresado); estos puntos en 3D (datos ingresados) pertenecen todos al mismo plano si el usuario no modifica la posici\'on del mismo (normal del plano). \'Esta es la opci\'on que se utilizar\'a para identificar y modificar un punto en 3D.
\end{enumerate}

\bigskip

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 255]{../fuente/Imagenes_mejoradas/tesis_plano_movil_1.png}
 \caption{Infinitos puntos que representa el cursor del mouse (Vista 1).}
 \label{fig:linea_imaginaria1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 266]{../fuente/Imagenes_mejoradas/tesis_plano_movil_2.png}
 \caption{Infinitos puntos que representa el cursor del mouse (Vista 2).}
 \label{fig:linea_imaginaria2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 259]{../fuente/Imagenes_mejoradas/tesis_plano_movil_3.png}
 \caption{Entrada de datos: puntos en 3D dispuestos en el mismo plano (Vista 1).}
 \label{fig:linea_imaginaria3}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 225]{../fuente/Imagenes_mejoradas/tesis_plano_movil_4.png}
 \caption{Entrada de datos: puntos en 3D dispuestos en el mismo plano (Vista 2).}
 \label{fig:linea_imaginaria4}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

			\subsubsection{Plano m\'ovil}

El plano m\'ovil es un plano manipulable que contiene un punto origen con el prop\'osito de visualizarlo sobre un punto espec\'ifico. Mediante la interfaz pro\-pues\-ta se podr\'a editar el punto origen y la direcci\'on de la normal del plano.

La manipulaci\'on del plano m\'ovil posibilitar\'a al usuario ubicarlo en la direcci\'on deseada. Una vez que el plano est\'e posicionado en dicha posici\'on se podr\'a ingresar o editar puntos en 3D. Este ingreso se lograr\'a por medio de la intersecci\'on de la recta descrita previamente con el plano m\'ovil.

Se ha propuesto acotar visualmente al plano mediante un cuadrado para fa\-ci\-li\-tar la edici\'on del mismo. Este cuadrado estar\'a centrado en un punto denominado origen del plano. 

En la Figura ~\ref{fig:plano_movil} y la Figura ~\ref{fig:plano_movil_con_rotacion} es posible visualizar el plano m\'ovil y un movimiento de \'este.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 361]{../fuente/Imagenes_mejoradas/tesis_rotacion_plano_movil_1.png}
\caption{Plano m\'ovil: punto fijo y punto m\'ovil.}
 \label{fig:plano_movil}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 308]{../fuente/Imagenes_mejoradas/tesis_rotacion_plano_movil_2.png}
 \caption{Plano m\'ovil: rotaci\'on.}
 \label{fig:plano_movil_con_rotacion}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

			\subsubsection{Intersecci\'on de una recta con el plano m\'ovil}

Una recta queda definida con dos puntos. Si se desea intersectar una recta con un plano se debera tener en cuenta como est\'an posicionados los dos puntos que la definen con respecto a dicho plano, se pueden apreciar una serie de situaciones:

\begin{itemize}
 \item 
Si ambos puntos est\'an contenidos en el plano, entonces la recta pertenece al plano e infinitos puntos intersectan el plano (Figura ~\ref{fig:situaciones_puntos}, caso 1).
 \item 
Si s\'olo uno de los dos puntos est\'a contenido en el plano, la intersecci\'on con el plano ser\'a dicho punto (Figura ~\ref{fig:situaciones_puntos}, caso 2).
 \item 
Si ninguno de los dos puntos est\'an contenidos en el plano existen dos alternativas:
\begin{itemize}
 \item 
La recta que forman estos puntos es paralela al plano y, por ende, no lo intersecta (Figura ~\ref{fig:situaciones_puntos}, caso 3).
 \item 
La recta que forman estos puntos no es paralela al plano y lo intersecta en un \'unico punto. (Figura ~\ref{fig:situaciones_puntos}, caso 1).
\end{itemize}
\end{itemize}

\'Este \'ultimo caso ser\'a la situaci\'on de inter\'es.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 155 413]{../fuente/Imagenes_mejoradas/tesis_situaciones_puntos.png}
 \caption{Casos de intersecci\'on entre una recta y un plano seg\'un como est\'en posicionados los puntos que definen la recta.}
 \label{fig:situaciones_puntos}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Para identificar cada una de estas situaciones se consideran una recta formada por dos puntos distintos $p_0$ y $p_1$ y un plano $\Pi$.

Donde:

$p_0$ es el primer punto,

$p_1$ es el segundo punto,

$\vec{N}$ es la normal del plano $\Pi$,

$O$ es un punto del plano.\\

La proyecci\'on de un vector $\vec{v_{0,1}} = p_1 \textendash p_0$ sobre la normal del plano $\vec{N}$ est\'a definida de la siguiente manera:\\

$proy \xrightarrow[\vec{v_{0,1}}]{} \vec{N} = \frac{\vec{v_{0,1}}.\vec{N}}{|\vec{N}|}$

Si el vector formado con $O$ y $p_0$ proyectado sobre la normal del plano es cero, entonces se tiene el caso donde el punto $p_0$ se encuentra contenido en el plano. Si la proyecci\'on es distinto de cero, el punto no estar\'a contenido en el plano. Procediendo de la misma manera con el punto $p_1$, se identifica si \'este se encuentra contenido en el plano o no.

Si ya se ha asegurado que ninguno de los puntos se encuentran contenidos en el plano y la recta formada por ellos no es paralela al plano se proceder\'a a calcular el punto \'unico donde intersecan la recta y el plano.

Se considerar\'a un plano $\Pi$ y una recta $L_1$.

Plano:

\begin{equation}
  \Pi : \alpha x +  \beta y +  \gamma z = d
  \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}\\

Recta que pasa por dos puntos:

\begin{equation}
  L_1 : (x,y,z) = p_0 + t v \; \; \text{,   con t variando desde } \; \; [-\infty , \infty]
  \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}

con:

$p_0 = (a_x,a_y,a_z)$ \text{, el primer punto}

$p_1 = (b_x,b_y,b_z)$ \text{, el segundo punto}

$\vec{v} = {p_0} \textendash {p_1}$ \text{, el vector direcci\'on de la recta}

$\vec{v} = (a_x - b_x , a_y - b_y , a_z - b_z)$ \\


Las ecuaciones param\'etricas de $L_1$ son:

$x = a_x + t (a_x- b_x)$

$y = a_y + t (a_y- b_y)$

$z = a_z + t (a_z- b_z)$ \\


Utilizando las ecuaciones param\'etricas de la recta y reemplaz\'andolas en la ecuaci\'on del plano se obtiene el valor de $t=t_1$ donde la recta y el plano se intersectan.\\

\begin{equation}
 t_1 = \frac{d \textendash (\alpha  a_x + \beta  a_y + \gamma  a_z ) }{(\alpha  (a_x \textendash b_x) + \beta  (a_y \textendash b_y) + \gamma  (a_z \textendash b_z) )}
 \renewcommand{\theequation}{\arabic{section}.\arabic{equation}}
\end{equation}\\

Reemplazando $t_1$ en la ecuaci\'on de la recta se obtienen las coordenadas del punto del plano intersectado por la recta.

			\subsubsection{Rotaci\'on con un punto fijo}

Cuando se realiza una rotaci\'on se necesitan un eje y un \'angulo de rotaci\'on. El \'angulo y el eje de rotaci\'on se definen con dos puntos, uno denominado punto fijo $(p_f)$ y otro denominado punto m\'ovil $(p_m)$. \cite{cosimo}

El punto en la pantalla debajo del cursor del mouse no solo representa a un \'unico punto en 3D, sino, a un conjunto infinito de puntos contenidos en una linea recta imaginaria. Esta linea parte del ojo del observador y pasa por un punto cualquiera del modelo debajo del cursor. Cuando la linea atraviesa un objeto, que se desea rotar, fijar\'a el ``punto m\'ovil'' de la rotaci\'on. El ``punto fijo'' ser\'a un punto del objeto que el usuario haya seleccionado para tal fin.

Una vez establecidos los puntos de inter\'es $(p_f \;  \text{y} \; p_m)$, se genera una esfera imaginaria centrada en el punto fijo. El radio de la esfera ser\'a igual a la magnitud del vector formado por $p_f$ y $p_m$ (a dicho vector se denominar\'a $\vec{v_0}$).  En la Figura ~\ref{fig:rotacion1} y ~\ref{fig:rotacion2} pueden visualizarse estos puntos.

Cuando el cursor cambia de posici\'on modifica la direcci\'on de la linea imaginaria. \'Esta puede intersectar nuevamente o no a la esfera. En la Figura ~\ref{fig:rotacion3} puede apreciarse el primer caso.


\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 217]{../fuente/Imagenes_mejoradas/tesis_rotacion1.png}
 \caption{Punto Fijo $p_f$.}
 \label{fig:rotacion1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 210]{../fuente/Imagenes_mejoradas/tesis_rotacion2.png}
 \caption{Punto Fijo $p_f$, Punto M\'ovil $p_m$ y esfera imaginaria.}
 \label{fig:rotacion2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 350 227]{../fuente/Imagenes_mejoradas/tesis_rotacion3.png}
 \caption{Vectores $\vec{v_0}$ y $\vec{v_1}$.}
 \label{fig:rotacion3}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Si la l\'inea interseca a la esfera lo har\'a en dos nuevos puntos, en el la parte anterior y en la parte posterior de \'esta. Si el punto m\'ovil se encuentra en la parte anterior de la esfera se considerar\'a la intersecci\'on m\'as cercana al ojo del observador, en caso contrario se considerar\'a la siguiente intersecci\'on. Al vector formado por el punto fijo y la intersecci\'on escogida se lo denominar\'a $\vec{v_1}$. En la Figura ~\ref{fig:rotacion3} pueden visualizarse los vectores $\vec{v_0}$ y $\vec{v_1}$.

En una rotaci\'on con un punto fijo el \'angulo entre $\vec{v_1}$ y $\vec{v_0}$ ser\'a el \'angulo de rotaci\'on y, el producto cruz entre \'estos vectores ser\'a el eje de rotaci\'on. Con el \'angulo y el eje de rotaci\'on, la esfera mantiene su centro invariante mientras gira siguiendo al cursor, arrastrando todo el espacio del modelo, es decir, gira a todo el objeto considerando dicho eje y \'angulo de rotaci\'on. 

En el caso de que la linea imaginaria no intersecte a la esfera se considerar\'a a un vector perpendicular a esta linea que parta desde el punto fijo de la esfera. Este vector procediendo de manera similar que el primer caso fijar\'a el \'angulo y el eje de rotaci\'on.

Si se considera que el mouse seguir\'a movi\'endose, es posible reasignar al vector $\vec{v_0}$ con el nuevo vector $\vec{v_1}$ y encontrar el siguiente vector $\vec{v_1}$ de manera que la rotaci\'on contin\'ue con otro eje y \'angulo de rotaci\'on.


			\subsubsection{Rotaci\'on del plano m\'ovil}

En el apartado anterior se ha descrito como obtener un \'angulo y un eje de rotaci\'on si se dispone de un punto fijo. El plano rota siguiendo esta t\'ecnica considerando que el punto fijo del plano es el punto ubicado en el centro del cuadrado que lo representa visualmente (denominado origen). El punto m\'ovil es definido por el usuario mediante el mouse. En la
Figura ~\ref{fig:plano_movil} y ~\ref{fig:plano_movil_con_rotacion} se visualiza al plano m\'ovil y una rotaci\'on de \'este.

			\subsubsection{Traslaci\'on del plano m\'ovil}

La interfaz gr\'afica desarrollada posibilita cambiar el punto origen del plano de dos formas:
\begin{itemize}
 \item 
Desplazando dicho punto sobre el mismo plano.
 \item
Desplazando dicho punto en la direcci\'on de la normal del plano.
\end{itemize}

El primer caso se logra activando la traslaci\'on y encontrando el nuevo punto mediante la intersecci\'on entre el plano y la recta que pasa por el ojo del observador y el punto en 3D debajo del cursor del mouse. Esta traslaci\'on tiene un prop\'osito visual, ya sea para observar mejor el modelo de la escena sin el plano o para definir la posici\'on de un punto espec\'ifico.

El segundo caso se consigue girando la rueda (scroll) del mouse. De esta forma se logra control sobre el movimiento del plano.


			\subsubsection{Selecci\'on de objetos}

Una vez que se ha definido como se visualizar\'an los objetos sobre la pantalla del monitor ser\'a de inter\'es  seleccionar estos objetos para luego poder editarlos. La forma con la que se realiza esta tarea es mediante la lectura del color del pixel de la pantalla donde se ha clickeado. Si cada objeto dispone de un color \'unico que lo identifica ser\'a posible seleccionarlo comparando el color del pixel clickeado en la pantalla y dicho identificador. Sin embargo en distintas ocasiones se desea que un objeto disponga de m\'as de un color o un color igual al de otro objeto. Por tal motivo el modo de proceder es el siguiente:

\begin{itemize}
 \item 
Cuando se realiza un click sobre la pantalla se activa el modo de selecci\'on.
 \item 
Este modo indica que todos los objetos deben ser dibujados con su color \'unico en el Back Buffer (Buffer donde se dibuja la siguiente imagen que se mostrar\'a).
 \item 
Se identifica el color del pixel de la pantalla (del Back Buffer) que se ha clickeado.
 \item 
Se compara dicho color con cada uno de los colores que identifican a los objetos.
 \item 
Si es igual a alguno de dichos colores, un objeto ser\'a seleccionado, en caso contrario se concluye que no se ha seleccionado ning\'un objeto.
 \item 
Se borra el Back Buffer antes de dibujar los objetos en pantalla.
 \item 
Se desactiva el modo de selecci\'on.
\end{itemize}

			\subsubsection{Utilidad del plano m\'ovil}

Cada punto de control se corresponde con un conjunto de knots dependiendo del grado de la NURBS. En el caso de las curvas se tiene solo un conjunto de knots (direcci\'on ``u''); sin embargo, para las superficies se dispone de dos grupos de knots (direcciones ``u'' y ``v'') para corresponderse con un grupo de puntos de control que est\'an dispuestos en forma de rejilla. \'Estas situaciones pueden apreciarse en la Figura ~\ref{fig:rejilla_con_nurbs} y la Figura ~\ref{fig:rejilla_sin_nurbs}.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 200 149]{../fuente/Imagenes_mejoradas/tesis_rejilla_con_nurbs.png}
 \caption{Superficie NURBS 3D con el pol\'igono de control.}
 \label{fig:rejilla_con_nurbs}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 200 149]{../fuente/Imagenes_mejoradas/tesis_rejilla_sin_nurbs.png}
 \caption{Pol\'igono de control en forma de rejilla.}
 \label{fig:rejilla_sin_nurbs}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Para crear un objeto por medio de una superficies NURBS 3D es conveniente modelarlo progresivamente. Para dicho fin se ha desarrollado una herramienta que permite insertar puntos de control tanto en la direcci\'on ``u'' como en la direcci\'on ``v''. La posici\'on donde son colocados estos nuevos puntos de control estar\'a definida por los puntos de control anteriores. 

Las Figura ~\ref{fig:tesis_modelado_prog_u_1}, ~\ref{fig:tesis_modelado_prog_u_2}, ~\ref{fig:tesis_modelado_prog_u_3} y ~\ref{fig:tesis_modelado_prog_u_4} muestran una curva NURBS 3D siendo modelada progresivamente en la direcci\'on ``u''. 
En la Figura ~\ref{fig:tesis_modelado_prog_u_2} se aprecia un punto de control posicionado siguiendo la direcci\'on de los dos puntos anteriores. En la Figura  ~\ref{fig:tesis_modelado_prog_u_3} la posici\'on de dicho punto de control es editada. En la Figura ~\ref{fig:tesis_modelado_prog_u_4} se visualiza un segundo punto de control ingresado posicionado con una  direcci\'on diferente debido a la edici\'on del punto anterior.

Seguidamente, en la Figura ~\ref{fig:tesis_modelado_prog_v_1} se puede observar la misma curva NURBS 3D siendo modelada progresivamente en la direcci\'on ``v'' convirtiendola en una superficie NURBS 3D. El procedimiento empleado es similar.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 290 234]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_u_1.png}
 \caption{Modelado progresivo en la direcci\'on ``u'': direcci\'on de la agregaci\'on.}
 \label{fig:tesis_modelado_prog_u_1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 290 237]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_u_2.png}
 \caption{Modelado progresivo en la direcci\'on ``u'': primer punto ingresado.}
 \label{fig:tesis_modelado_prog_u_2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 280 223]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_u_3.png}
 \caption{Modelado progresivo en la direcci\'on ``u'': edici\'on del primer punto ingresado.}
 \label{fig:tesis_modelado_prog_u_3}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 280 231]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_u_4.png}
 \caption{Modelado progresivo en la direcci\'on ``u'': segundo punto ingresado.}
 \label{fig:tesis_modelado_prog_u_4}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 324]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_v_1.png}
 \caption{Modelado progresivo en la direcci\'on ``v'': direcci\'on y primer conjunto de puntos de control ingresados.}
 \label{fig:tesis_modelado_prog_v_1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 327]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_v_2.png}
 \caption{Modelado progresivo en la direcci\'on ``v'': edici\'on del primer conjunto de puntos de control ingresados.}
 \label{fig:tesis_modelado_prog_v_2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 319]{../fuente/Imagenes_mejoradas/tesis_modelado_prog_v_3.png}
 \caption{Modelado progresivo en la direcci\'on ``v'': segundo conjunto de puntos de control ingresados.}
 \label{fig:tesis_modelado_prog_v_3}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Los puntos de control de una NURBS determinan su forma. De este modo, estos par\'ametros son, principalmente, los que se deben editar para modelar objetos de la realidad.

Utilizando la selecci\'on de objetos se identifica cuando se trata de un objeto NURBS 3D. En este caso se selecciona el punto de control m\'as cercano a la linea recta que atraviesa el ojo del observador y pasa por un punto 3D debajo del cursor. Una vez realizada dicha acci\'on, el plano es trasladado al punto de control seleccionado. La manipulaci\'on del plano (por medio de la t\'ecnica de rotaci\'on con un punto fijo) permite posicionar el plano sobre el cual se desear\'a trabajar. 

El punto de control seleccionado podr\'a ubicarse en cualquier posici\'on sobre el plano que se ha especificado siguiendo los movimientos del mouse. Otra posibilidad de movimiento se dar\'a mediante el scroll del mouse. Este evento mover\'a el punto de control en la direcci\'on perpendicular al plano. En la Figura ~\ref{fig:edicion1} puede apreciarse la edici\'on de un punto de control de una superficie NURBS 3D; en la tercer imagen de dicha figura el punto de vista permite visualizar que la edici\'on ha sido realizada sobre el mismo plano (plano x-z en este caso). En la Figura ~\ref{fig:edicion2} puede apreciarse la edici\'on del mismo punto de control pero realizando un scroll con el mouse.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 210 420]{../fuente/Imagenes_mejoradas/tesis_edicion_con_plano_movil_1.png}
 \caption{Edici\'on de un punto de control con el plano m\'ovil.}
 \label{fig:edicion1}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 250 448]{../fuente/Imagenes_mejoradas/tesis_edicion_con_plano_movil_2.png}
 \caption{Edici\'on de un punto de control mediante el scroll del mouse.}
 \label{fig:edicion2}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

Se brinda, entre otras herramientas, la posibilidad de rotar todo el modelo de una curva o superficie NURBS 3D utilizando la t\'ecnica de la rotaci\'on con un punto fijo. Es posible especificar un punto fijo que por defecto es el primero de los puntos de control considerando la direcci\'on ``u'' y la direcci\'on ``v''. Un ejemplo de esta situaci\'on se encuentra en las Figuras ~\ref{fig:rotacion1}, ~\ref{fig:rotacion2} y ~\ref{fig:rotacion3}.

		\subsection{Manipulaci\'on virtual de la c\'amara}

Como ya se ha mencionado, para OpenGL, el observador de la escena es an\'alogo a una c\'amara fotogr\'afica. Su definici\'on implica especificar tres par\'ametros (vectores):
\begin{itemize}
 \item 
Eye.
 \item 
LookAt.
 \item 
Up.
\end{itemize}

Eye, o ojo del observador, definir\'a la ubicaci\'on de la c\'amara. LookAt indica hacia donde se observa o apunta el ojo del observador. Up (arriba) indica la vertical de la c\'amara. Si alguno de estos vectores cambia, la visualizaci\'on de la escena tambi\'en lo har\'a.

Se ha propuesto cambiar el estado de estos vectores tomando como par\'ametros los movimientos verticales y horizontales del cursor del mouse (cuando se presiona el click izquierdo de \'este). Se considerar\'a que la visualizaci\'on de la escena sobre la pantalla del monitor es un sistema de coordenadas en 2D, donde el eje ``y'' aumenta hacia abajo y el eje ``x'' aumenta hacia la derecha. 

En la Figura ~\ref{fig:coordenadas pantalla} se puede apreciar los vectores Eye, LookAt y Up; adem\'as, se indica como la pantalla se considera un sistema de coordenadas en 2D.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 450 381]{../fuente/Imagenes_mejoradas/tesis_pantalla.png}
 \caption{(a) Vectores que definen la posici\'on de la c\'amara. (b) Coordenadas en 2D de la pantalla.}
 \label{fig:coordenadas pantalla}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

El movimiento vertical (hacia arriba y abajo) modificar\'a el estado de los vectores ``Eye'' y ``Up'' de una manera \'unica sin importar la posici\'on en ``x'' en la que se encuentre el cursor. El cambio se llevar\'a a cabo rotando dichos vectores sobre un eje que es calculado de la siguiente manera:

\begin{equation}
Up X (Eye \textendash LookAt)
\nonumber
\end{equation}

Para calcular el \'angulo de esta rotaci\'on se identifica el diferencial del movimiento en las coordenadas ``y'', luego se mapea dicho valor para que cuando \'este sea igual al alto de la pantalla se corresponda con un angulo igual a $\Pi$ (Pi):

\begin{equation}
angulo = \Pi * (deltaY / HEIGHT)
\nonumber
\end{equation}

El movimiento horizontal, al igual que el vertical, modificar\'a el estado de los vectores ``Eye'' y ``Up''. Sin embargo, dependiendo de la coordenada ``y'' en la que se encuentre el cursor, los cambios ser\'an en diferentes proporciones para cada vector: 
\begin{itemize}
 \item 
Si el cursor se encuentra cercano a los extremos (superior e inferior) de la pantalla la rotaci\'on del vector ``Up'' (tomando como eje el vector definido como Eye-LookAt) ser\'a de mayor proporci\'on.
 \item 
Si el cursor se encuentra cercano al centro de la pantalla la rotaci\'on del vector ``Eye'' (tomando como eje el vector Up) ser\'a de mayor proporci\'on.
\end{itemize}


La proporci\'on de la rotaci\'on del vector ``Up'' se obtiene seg\'un la siguiente ecuaci\'on:

\begin{equation}
p_{up} = \frac{(y \textendash (HEIGHT / 2))^2}{(HEIGHT/2)^2}
\nonumber
\end{equation}

Si:

$y = 0 \Rightarrow p_{up} = 1$

$y = HEIGHT / 2.0  \Rightarrow  p_{up} = 0$

$y = HEIGHT \Rightarrow p_{up} = 1$


La proporci\'on de la rotaci\'on del vector ``Eye'' se obtiene seg\'un la siguiente ecuaci\'on:

\begin{equation}
p_{Eye}  = -1 * p_{up} + 1
\nonumber
\end{equation}

Si:

$y = 0 \Rightarrow p_{up} = 1 \Rightarrow p_{eyes}  = 0$

$y = (HEIGHT / 2.0) \Rightarrow p_{up} = 0 \Rightarrow p_{eyes}  = 1$

$y = HEIGHT \Rightarrow p_{up} = 1 \Rightarrow p_ {eyes} = 0$

Para ambos casos $HEIGHT$ es el alto de la pantalla e $Y$ es la coordenada ``y'' donde se encuentra el  cursor.

Procediendo de igual manera que el movimiento vertical, para calcular el \'angulo de rotaci\'on se identifica el diferencial del movimiento en las coordenadas ``x'', luego se mapea dicho valor para que cuando \'este sea igual al ancho de la pantalla se corresponda con un angulo igual a $\Pi$:

\begin{equation}
angulo = \Pi * (deltaX / WIDTH)
\nonumber
\end{equation}


Fundamentalmente el movimiento horizontal genera un mayor control de la c\'amara, posibilitando ubicar el punto de vista hacia una posici\'on deseada m\'as r\'apidamente.

%--------------------------------------

\setcounter{equation}{0}
\setcounter{section}{0}

\part{Desarrollo del software}
	
	\section{Etapas del desarrollo}

El modelo que se ha utilizado para desarrollar el sistema es el ``modelo en cascada'' o ``modelo cl\'asico''. Este modelo ordena las etapas de modo que el inicio de cada una debe esperar la finalizaci\'on de la etapa anterior.
Las etapas del proyecto son:
\begin{enumerate}
 \item 
Especificaci\'on de los requisitos.
 \item 
Dise\~no del sistema.
 \item 
Codificaci\'on.
 \item 
Pruebas.
\end{enumerate}

		\subsection{Especificaci\'on de requisitos}

En primer lugar se han identificado los ``requisitos funcionales'' -servicios que ofrece el sistema-  y los ``requisitos no funcionales -restricciones de los servicios que ofrece el sistema- para el caso particular de la creaci\'on y edici\'on de NURBS 3D. 

			\subsubsection{Requisitos Funcionales}

Una t\'ecnica que plasma estos requisitos son los “Casos de Usos”. \'Estos son  muy utilizados en la pr\'actica ya que combinan elementos t\'ecnicos con gr\'aficos simples. Gracias a \'estos es posible que personas que no disponen demasiado conocimiento en inform\'atica puedan entender lo que el sistema es capaz de realizar.
Los casos de usos del sistema son:
\begin{enumerate}
 \item 
01-Agregar NURBS.
 \item 
02-Editar NURBS.
 \item 
03-Seleccionar Objeto.
 \item 
04-Eliminar NURBS.
 \item 
05-Importar NURBS.
 \item 
06-Exportar NURBS.
 \item 
07-Mover el plano m\'ovil.
\end{enumerate}

En la Figura ~\ref{fig:casos_de_uso} es posible visualizar estos casos de usos y se indica que el sistema dispondr\'a de s\'olo un usuario.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 275]{../fuente/Imagenes_mejoradas/tesis_casos_de_uso.png}
 \caption{Casos de uso del sistema.}
 \label{fig:casos_de_uso}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\clearpage

A continuaci\'on se detallar\'a cada caso de uso.\\

\textbf{Caso de Uso: } 01-Agregar NURBS


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario selecciona el bot\'on en forma de NURBS o selecciona el men\'u Objetos/Agregar NURBS. &
~
\\\hline
~

2-El sistema despliega una ventana en donde el usuario ingresa la
cantidad de puntos de control en la direcci\'on \textbf{u} y en la
direcci\'on \textbf{v} que la NURBS dispondr\'a.  &
~
\\\hline
~

3-El usuario presiona el bot\'on Crear. &
~

3.1-El usuario cancela la operaci\'on.

3.2-La NURBS no se crea y el caso de uso finaliza.\\\hline
~

4-El sistema muestra una NURBS con la cantidad de puntos de control que
se ha establecido. &
~
\\\hline
~

5-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }


%-------------------------------------------
\clearpage

\textbf{Caso de Uso: } 02-Editar NURBS


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario realiza el caso de uso {\textquotedblleft}03-Seleccionar
Objeto{\textquotedblright} y selecciona una NURBS posicionandose sobre
uno de sus puntos de control. &
~
\\\hline
~

2-El usuario desplaza el punto de control seleccionado proyectandolo
sobre el plano m\'ovil. &
~

2.1-El usuario ingresa una coordenada diferente del punto de control por
medio de la interfaz gr\'afica.\\\hline
~

3-El sistema mueve el punto de control cambiando tambi\'en la NURBS. &
~
\\\hline
~

4-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }

Debe existir una NURBS.


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }

%-------------------------------------------
\clearpage

\textbf{Caso de Uso: } 03-Seleccionar Objeto.


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario hace un click con el puntero del mouse sobre la pantalla. &
~
\\\hline
~

2-El sistema reconoce si se ha seleccionado un objeto procesando el
color del pixel donde se produjo el click.  &
~
\\\hline
~

3-Un objeto ha sido seleccionado y el sistema lo indica cambiando de
color dicho objeto. &
~

3.1-No ha sido seleccionado ning\'un objeto, el sistema muestra las
opciones de la c\'amara y el caso de uso finaliza.\\\hline
~

4-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }

%-------------------------------------------
\clearpage

\textbf{Caso de Uso: } 04-Eliminar NURBS


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario realiza el caso de uso ''03-Seleccionar Objeto`` y selecciona una
NURBS posicionandose sobre uno de sus puntos de control. &
~
\\\hline
~

2-El usuario presiona el bot\'on Eliminar. &
~

~
\\\hline
~

3-El sistema elimina la NURBS de la lista de elementos y tambi\'en del
sistema de coordenadas. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }

Debe existir una NURBS.


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }


%-----------
\clearpage

\textbf{Caso de Uso: \ } 05-Importar NURBS.


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario presiona el bot\'on para abrir un projecto. &
~
\\\hline
~

2-El sistema muestra un cuadro de di\'a\-lo\-go mostrando el sistema de
archivos del sistema operativo. &
~
\\\hline
~

3-El usuario selecciona un archivo con el formato XML. &
~
\\\hline
~

4-El sistema procesa el archivo y luego agrega las NURBS en el arbol de
elementos y en el sistema de coordenadas.  &
~

4.1-El archivo no dispone de la estructura correcta y el sistema muestra
un mensaje de error.\\\hline
~

5-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }

Debe existir una NURBS.


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }


%-----------
\clearpage

\textbf{Caso de Uso: \ } 06-Exportar NURBS.


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario presiona el bot\'on guardar un proyecto. &
~
\\\hline
~

2-El sistema indica que se ha guardado correctamente. &
~

2.1-El sistema indica que no se ha guardado correctamente en caso de no
poseer ninguna NURBS para ser guardada.\\\hline
~

3-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }

Debe existir una NURBS.


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }

%------------------
\clearpage

\textbf{Caso de Uso: } 07-Mover el plano m\'ovil.


\bigskip

\textbf{Actor:} Usuario


\bigskip

\begin{flushleft}
\tablehead{}\begin{supertabular}{|m{7cm}|m{7cm}|}
\hline
\bfseries Curso Normal &
\bfseries Curso Alternativo\\\hline
~

1-El usuario realiza el caso de uso {\textquotedblleft}03-Seleccionar
Objeto{\textquotedblright} y selecciona el plano m\'ovil posicionandose
sobre \'este. &
~
\\\hline
~

2-El usuario indica la posici\'on del plano moviendo el mouse en las
direcciones arriba/abajo, izquierda/derecha o cambiando los atributos
en el \'area de atributos del plano m\'ovil. &
~
\\\hline
~

3-El sistema muestra las rotaciones del plano m\'ovil. &
~
\\\hline
~

4-El caso de uso finaliza. &
~
\\\hline
\end{supertabular}
\end{flushleft}

\bigskip

\textbf{Requerimientos Especiales:} 


\bigskip

{\bfseries
Pre-condiciones: }


\bigskip

{\bfseries
Post-condiciones: }


\bigskip

{\bfseries
Puntos de \ Extensi\'on: }

			\subsubsection{Requisitos No Funcionales}

El sistema debe satisfacer las siguientes restricciones de los servicios:
\begin{enumerate}
 \item 
Eficiencia: En este tipo de sistemas la velocidad de respuesta es muy importante. Tanto los movimientos de la c\'amara como los de los puntos de control de una NURBS deben ser lo suficientemente fluidos como para obtener una operabilidad aceptable (el usuario debe observar los cambios con un margen de tiempo reducido). Cabe aclarar que la placa gr\'afica y el procesador que el ordenador disponga son elementos que pueden salvaguardar el problema de la eficiencia. Sin embargo se han identificado los fragmentos de c\'odigo m\'as utilizados y se han propuesto algunas t\'ecnicas que permiten obtener una mejor performance.

 \item 
Extensibilidad: El sistema desarrollado debe ser capaz de expandir sus funcionalidades en caso de ser necesario. Mediante el paradigma de orientaci\'on a objetos se ha propuesto realizar estas expansiones por medio del agregado de m\'odulos.

 \item 
Independencia de la plataforma: Actualmente dos de los sistemas operativos m\'as utilizados son:  Microsoft Windows y GNU Linux. El sistema de\-sa\-rro\-lla\-do, instalando previamente las dependencias necesarias, puede ser ejecutado en ambos sistemas operativos.

 \item 
Documentaci\'on: Todo el sistema para su correcto entendimiento y uso debe estar documentado. 
La documentaci\'on explica el prop\'osito, la l\'ogica, las relaciones y la codificaci\'on del sistema. Tambi\'en incluye instrucciones sobre el funcionamiento del programa, las ordenes y entradas necesarias para hacerlo funcionar. 
Con respecto a la documentaci\'on de la estructura del sistema se ha realizado un esquema de las clases que participan y sus in\-te\-ra\-ccio\-nes, de este modo se plantea el funcionamiento del sistema a grandes rasgos.
Como ya se ha mencionado antes, el sistema est\'a compuesto por una estructura que permite la adici\'on de m\'odulos. Los pasos para agregar un m\'odulo tambi\'en se encuentran documentados.
La instalaci\'on del sistema se encuentra  explicada en un documento PDF (acr\'onimo del ingl\'es Portable Document Format). 
El manual de referencia de uso tambi\'en se encuentra en el mismo formato y en un formato HTML (acr\'onimo del ingl\'es HyperText Markup Language).
Todos los documentos mencionados se encuentran en formato digital.
\end{enumerate}

		\subsection{Dise\~no del sistema}

			\subsubsection{Diagrama de clases}

El sistema desarrollado cuenta con ocho clases relacionadas entre si:
\begin{itemize}
 \item 
Interfaz. Se encarga de administrar y mostrar la interfaz gr\'afica (ventana principal). Adem\'as, contiene una entidad de la clase Escena a la cual env\'ia se\~nales seg\'un los eventos reproducidos en la interfaz.
 \item 
Escena. Administra la c\'amara, las luces y los objetos (el plano, las nurbs, etc.). Recibe y procesa las se\~nales enviadas por la Interfaz. Seg\'un dichas se\~nales, env\'ia nuevamente a la Interfaz fragmentos de c\'odigos para ser ejecutados.
 \item 
C\'amara. Permite modificar el modo de visualizar la escena y sirve a las dem\'as clases para proyectar una linea recta e intersectar al plano tridimensional.
 \item 
Plano. Permite mostrar un plano (acotado visualmente) centrado en un punto espec\'ifico. Adem\'as, dispone funciones para editar la posici\'on y direcci\'on de dicho plano.
 \item 
NurbSurface. Posibilita mostrar una curva o superficie NURBS, editar sus puntos de control y rotar todo el modelo con un punto fijo.
 \item 
XmlNurbParser. Responde a un evento de la interfaz: guardar o abrir. En el primer caso procesa los objetos en la escena y escribe un archivo (en el formato XML) ubicado en la direcci\'on asignada por el usuario. En el segundo caso lee un archivo (en el formato XML), lo interpreta y crea los objetos para ser mostrados en la escena.
 \item 
Library. Dispone funciones comunes para todas las clases.
\end{itemize}

El la Figura ~\ref{fig:clases} se muestran dichas clases posicionadas seg\'un sus relaciones.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 217]{../fuente/Imagenes_mejoradas/tesis_clases.png}
 \caption{Clases del sistema.}
 \label{fig:clases}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

La clase Escena recibe las se\~nales de la clase Interfaz. Procesa dichas se\~nales y asigna una acci\'on al objeto que corresponda (luz, c\'amara, Nurbs o plano). Estas se\~nales son eventos que se producen en la interfaz gr\'afica: un bot\'on presionado, un click sobre el \'area de renderizado, entre otros. Por su parte, los objetos deben proveer a la Escena una serie de funciones obligatorias llamadas callbacks. Un callback es un c\'odigo ejecutable que es pasado c\'omo un argumento a otro c\'odigo. 

Como ya se ha introducido, el \'area de trabajo de la interfaz gr\'afica utiliza OpenGL para la visualizaci\'on de la escena. Las interfaces gr\'aficas est\'an dirigidas por eventos de modo que es necesario organizar el programa como una colecci\'on de callbacks que van a ser ejecutados cuando se produzca el evento co\-rres\-pon\-dien\-te.

En el \'area de trabajo existen dos eventos principales:
\begin{enumerate}
 \item 
Cuando se produce un click con el mouse sobre el \'area de trabajo.
 \item 
Cuando el cursor del mouse se desplaza sobre el \'area de trabajo manteniendo presionado un click.
\end{enumerate}

Estos eventos producen una serie de acciones. La clase que se encargar\'a de asociar dicho evento con el callback correspondiente es la Escena.

Existen una serie de callbacks que se deben conocer:
\begin{enumerate}
 \item 
Display: funci\'on invocada cuando el sistema determina que el contenido de la ventana tiene que ser redibujado, por ejemplo cuando la ventana se abre, o arrastramos otra ventana por delante de \'esta. 
\item 
Reshape: funci\'on invocada cuando la aplicaci\'on cambia de tama\~no, normalmente porque el usuario arrastre alguno de los bordes de la ventana con el cursor. 
\item 
Mouse: funci\'on invocada cuando alg\'un bot\'on del mouse produce alg\'un evento.
\item 
Motion: funci\'on invocada cuando el mouse se mueve.
\end{enumerate}

A su vez, existen callbacks que se desprenden de estos, como por ejemplo el scroll o el movimiento del mouse cuando se mantiene presionado uno de sus botones; ambos son un caso especial del callback Mouse y Motion.

			\subsubsection{Estructura en forma de plantilla}

De este modo, manteniendo una cantidad conocida de callbacks, es posible que la Escena permita la incorporaci\'on de un eventual nuevo objeto. Si se define c\'omo debe ser un objeto para que la Escena lo admita y se informa a la escena que se contar\'a con un nuevo objeto ser\'a posible extender la funcionalidad del sistema.

Un archivo debe poseer una serie de funciones y atributos para que sea v\'alido como objeto.\\


\textbf{Funciones:}

\begin{enumerate}
\item 
init: funci\'on inicializadora del m\'odulo, aqu\'i se define el nombre con el que aparecer\'a el m\'odulo, entre otras propiedades.
\item 
draw: funci\'on que servir\'a a la clase administradora ``Escena'' para el callback ``Display''.
\item 
Mouse: funci\'on que servir\'a a la clase administradora ``Escena'' para el callback ``Mouse''.
\item 
Motion: funci\'on que servir\'a a la clase administradora ``Escena'' para el callback ``Motion''.
\item 
atributesToEdit: atributos que el m\'odulo presentar\'a para editar por medio de la interfaz gr\'afica (estos atributos ser\'an mostrados por la interfaz en el \'area 2 de la Figura ~\ref{fig:partes cad}).
\item 
actionsToDo: acciones que el m\'odulo presentar\'a para ser ejecutadas por medio de la interfaz gr\'afica (estas acciones ser\'an mostradas por la interfaz en el \'Area 3 de la Figura ~\ref{fig:partes cad}).
\end{enumerate}



\textbf{Atributos:}

\begin{enumerate}
 \item 
identifier: n\'umero \'unico que identifica al m\'odulo (la identificaci\'on es mediante la t\'ecnica de selecci\'on).
 \item 
name: nombre del objeto.
 \item 
type: tipo del objeto.
 \item 
autoEliminate: variable booleana que indica a la clase administradora ``Escena'' si el m\'odulo debe ser eliminado.
 \item 
bSelected: variable booleana que indica si el objeto se encuentra seleccionado.
\end{enumerate}

Acompa\~nando a este informe puede encontrarse en formato digital un modelo para la creaci\'on de un objeto (ejemplo y documentaci\'on).

		\subsection{Codificaci\'on o implementaci\'on}

			\subsubsection{Lenguajes utilizados (Python)}

El sistema ser\'a codificado con el lenguaje de programaci\'on Python. Se ha elegido este lenguaje de programaci\'on porque su implementaci\'on es simple y permite trabajar tanto a bajo nivel como a alto nivel. Adem\'as, al ser un lenguaje interpretado ahorra un tiempo considerable en el desarrollo del programa debido a que  no necesita ser compilado. Sin embargo esta \'ultima propiedad lo hace m\'as lento que un lenguaje compilado, es por eso que tambi\'en se utiliza otro lenguaje de programaci\'on llamado Cython, \'este extiende Python hacia los lenguajes C o C++.

			\subsubsection{Gui utilizada (Gtk)}

La biblioteca que se utiliza para la creaci\'on de la interfaz gr\'afica es GTK.  Su elecci\'on se debe a que es portable, es decir, puede ser ejecutado en varios sistemas operativos (GNU Linux, Microsoft Windows, MacOS X) ofreciendo una imagen agradable en cada uno de ellos, dispone de una licencia libre (LGPL) y una amplia documentaci\'on. 
Se ha utilizado el programa Glade para la creaci\'on est\'atica de la interfaz. Este programa dispone de una interfaz que permite agregar widgets con el mouse. Un widget es un componente gr\'afico que el usuario visualiza y con el cual interact\'ua, como por ejemplo, un \'icono, un men\'u desplegable, una ventana, un \'arbol de propieades o una caja de texto.

			\subsubsection{Librer\'ia Gr\'afica (Opengl)}

El \'area de trabajo utiliza para generar y mostrar las im\'agenes la API gr\'afica OpenGL. GTK utiliza un widget especial para contener esta \'area. Este widget es provisto por una extensi\'on de GTK llamada GtkGlExt.


			\subsubsection{Bindings utilizados (pyOpenGL, pyGtk)}

El lenguaje de programaci\'on que se ha elegido para desarrollar el sistema necesita los bindings (puentes) adecuados para disponer la capacidad de utilizar estas librer\'ias y API's. El acceso hacia la librer\'ia gr\'afica GTK lo hace por medio de PyGtk y hacia OpenGL lo hace por medio de pyOpenGL.

		\subsection{Pruebas}

			\subsubsection{Independencia de plataforma}

El sistema desarrollado ha sido ejecutado bajo las plataformas Microsoft Windows y GNU Linux. En ambos casos es necesario instalar las dependencias co\-rres\-pon\-dien\-tes que el sistema necesita (como ser Gtk y OpengGL) y sus respectivos bindings (como ser pyGtk y pyOpenGL). En ambas plataformas el sistema se comport\'o correctamente.

En la Figura ~\ref{fig:sistema_en_windows} se muestra el programa siendo ejecutado bajo la plataforma Microsoft Windows y en la Figura ~\ref{fig:sistema_en_linux} se muestra el programa siendo ejecutado bajo la plataforma GNU Linux.

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 300]{../fuente/Imagenes_mejoradas/tesis_windows.jpg}
 \caption{Sistema ejecutado bajo la plataforma Microsoft Windows.}
 \label{fig:sistema_en_windows}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

\begin{figure}[H]
 \centering
 \includegraphics[bb=0 0 400 300]{../fuente/Imagenes_mejoradas/tesis_linux.png}
 \caption{Sistema ejecutado bajo la plataforma GNU Linux.}
 \label{fig:sistema_en_linux}
 % nurbs_en_CAD.png: 480x413 pixel, 72dpi, 16.93x14.57 cm, bb=0 0 480 413
\end{figure}

			\subsubsection{Performance}

El sistema ha sido ejecutado en m\'aquinas con diferentes prestaciones comportandose mejor en aquellas con hardware m\'as potente. En la siguiente lista es posible observar las prestaciones de las m\'aquinas sobre las cuales se ha probado el sistema con los resultados obtenidos.\\

\begin{center}
\textbf{\underline{PRUEBA 1}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} Pentium 3. 800 MHz
 \item 
\textbf{Placa de video:} Integrada (32 MB)
 \item 
\textbf{Ram:} 128 MB
 \item 
\textbf{Sistema Operativo:} GNU Linux
 \item 
\textbf{Resultado:} Aceptable
\end{itemize}

\begin{center}
\textbf{\underline{PRUEBA 2}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} Pentium 4. 1,6 GHz 
 \item 
\textbf{Placa de video:} Integrada (64 MB)
 \item 
\textbf{Ram:} 512 MB
 \item 
\textbf{Sistema Operativo:} Microsoft Windows
 \item 
\textbf{Resultado:} Aceptable 
\end{itemize}

\begin{center}
\textbf{\underline{PRUEBA 3}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} Athlon XP. 1,4 GHz
 \item 
\textbf{Placa de video:} No integrada (64 MB)
 \item 
\textbf{Ram:} 640 MB
 \item 
\textbf{Sistema Operativo:} Microsoft Windows
 \item 
\textbf{Resultado:} Bueno
\end{itemize}

\begin{center}
\textbf{\underline{PRUEBA 4}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} Celeron 1.8 GHz
 \item 
\textbf{Placa de video:} No integrada (64MB)
 \item 
\textbf{Ram:} 1.5 GB
 \item 
\textbf{Sistema Operativo:} 1.5 GBGNU Linux
 \item 
\textbf{Resultado:} Muy bueno
\end{itemize}

\begin{center}
\textbf{\underline{PRUEBA 5}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} Centrino Dual-Core. 1.8 Ghz
 \item 
\textbf{Placa de video:} Integrada (128 MB)
 \item 
\textbf{Ram:} 2 GB
 \item 
\textbf{Sistema Operativo:} GNU Linux
 \item 
\textbf{Resultado:} Muy Bueno
\end{itemize}

\begin{center}
\textbf{\underline{PRUEBA 6}}
\end{center}
\begin{itemize}
 \item 
\textbf{Procesador:} AMD Athlon Dual-Core. 2.0 Ghz
 \item 
\textbf{Placa de video:} No integrada (256 MB)
 \item 
\textbf{Ram:} 2 GB
 \item 
\textbf{Sistema Operativo:} GNU Linux
 \item 
\textbf{Resultado:} Excelente
\end{itemize}



			\subsubsection{Funcionalidad}

El sistema ha sido probado por personas que disponen conocimiento o alguna vez han utilizado un programa CAD y por personas que nunca lo han hecho. En el primer caso las personas se han manejado aceptablemente con respecto al posicionamiento de la c\'amara identificando la funcionalidad de alguno de los iconos, sin embargo en muy pocas ocaciones han podido identificar c\'omo crear y editar las curvas y superficies NURBS. Por eso mismo, fue necesario realizar una breve introducci\'on sobre la funcionalidad ge\-ne\-ral de la aplicaci\'on se\~nalando c\'omo crear los objetos y la forma principal de editarlos, los  resultados fueron positivos.

En el segundo caso los usuarios, al igual que el anterior grupo, han entendido r\'apidamente como mover la posici\'on de la c\'amara pero no han identificado los iconos disponibles. Luego de la misma introducci\'on sobre la funcionalidad ge\-ne\-ral de la aplicaci\'on han entendido como realizar las funciones b\'asicas y logrado interactuar con el sistema.

Los usuarios m\'as experimentados han sugerido realizar algunas herramientas que han visualizado o usado en otros CADs y 
ambos usuarios concordaron que el sistema debe contar con una herramienta para deshacer los cambios producidos, ya que en algunos casos la posici\'on no adecuada del plano m\'ovil produjo el movimiento de algunos de los puntos de control hacia puntos alejados.

%--------------------------------------

\setcounter{equation}{0}
\setcounter{section}{0}

\part{Conclusiones}
	
	\section{Conclusiones Generales}

Se ha logrado desarrollar un sistema CAD que permite la creaci\'on, visualizaci\'on y edici\'on de curvas y superficies NURBS 3D y el posterior almacenamiento de \'estas en un archivo con formato XML. \'Este ha sido probado por diferentes tipos de usuarios los cuales concluyeron que el producto es bueno a pesar de que surgieron ideas y sugerencias acerca de algunas funcionalidades que se podr\'ia emplear.

El sistema responde adecuadamente a los eventos que el usuario realiza normalmente como ser el cambio del punto de vista del observador y la edici\'on de los puntos de control de una curva o superficie NURBS 3D.

Se ha conseguido, adem\'as, manipular puntos en 3D mediante proyecciones sobre un plano m\'ovil en el espacio tridimensional de una forma intuitiva lo cual permite al usuario editar los puntos de control libremente. 

La estructura con la que fu\'e dise\~nado el sistema permite la agregaci\'on de funcionalidades en forma de m\'odulos. \'Esto contribuye con la comunidad cient\'ifica otorgando un material dise\~nado de origen para servir de soporte a ge\-ne\-ra\-do\-res de mallas de superficies 3D.

Como contraparte el sistema ha sido programado practicamente en su to\-ta\-li\-dad con un lenguaje interpretado. De este modo se obtiene como resultado un programa CAD que podr\'ia responder m\'as r\'apidamente en el caso de que su codificaci\'on se realizara con un lenguaje compilado.



	\section{Trabajos Futuros}

Todo sistema inform\'atico puede mejorar, de esta forma en primer medida un posible trabajo futuro ser\'ia mejorar el sistema desarrollado, ya sea eficientizando los algoritmos escritos o reescribiendo el programa (tomando como base la estructura del sistema) en un lenguaje compilado.

En segunda medida se plantea el estudio detallado del m\'odulo que permite la visualizaci\'on (adem\'as de la creaci\'on y edici\'on) de las curvas y superficies NURBS 3D y agregar a \'este una funcionalidad  que consista en mallar dicha curva o superficie.

\clearpage

\bibliographystyle{plain}
\bibliography{sample.bib}

\end{document}